#!/usr/bin/env ruby
require 'erb'

require_relative 'run.rb'


def main(version)
  unless version.match?(/\d+\.\d+\.\d+/)
    abort "Version string #{version.inspect} does not look like a semver (e.g. \"1.0.2\"). Aborting."
  end

  env = %w[/usr/bin/env BUNDLE_FLAGS=--no-deployment]
  run!(env + %w[make verify smoke-test])

  puts 'Testing for changed files'
  run!(%w[git diff --quiet --exit-code])

  puts 'Testing for staged changes'
  run!(%w[git diff --quiet --cached --exit-code])

  tag_name = "v#{version}"
  write_version_files(version)

  run!(%W[_support/generate_changelog #{version}])
  run!(%w[git add changelogs CHANGELOG.md])

  version_msg = "Version #{version}"
  run!(%W[git commit -m #{version_msg}])
  run!(%w[gem build gitaly.gemspec])
  run!(%W[git tag -a -m #{version_msg} #{tag_name}])

  # We use 'capture!' to prevent 'git show' from invoking 'less'.
  show_output = capture!(%W[git show --pretty #{tag_name}])
  puts show_output

  puts "If this is not a security release you can now publish this tag to gitlab.com:\n\n\t_support/publish #{tag_name}\n\n"
end

def write_version_files(version)
  version_file = 'VERSION'
  open(version_file, 'w') { |f| f.puts version }
  run!(%W[git add #{version_file}])

  ruby_proto_version_file = 'ruby/proto/gitaly/version.rb'
  open(ruby_proto_version_file, 'w') do |f|
    f.puts <<~PROTO_VERSION
      # This file was auto-generated by #{$0}
      module Gitaly
        VERSION = '#{version}'
      end
    PROTO_VERSION
  end

  # Generating code is tricky. Let's actually load the gem, and inspect
  # the version constant.
  check = capture!(%W[ruby -Iruby/proto -rgitaly -e #{'print Gitaly::VERSION'}])
  unless check == version
    puts "fatal: ruby proto version check failed. \n\n"
    puts capture!(%w[git diff])
    abort
  end

  run!(%W[git add #{ruby_proto_version_file}])
end

def error(msg)
  warn "#{$0}: #{msg}"
end

unless ARGV.count == 1
  warn "Usage: #{$0} VERSION"
  warn "Specify version as x.y.z"
  abort
end

directory_current_file = File.expand_path('..', __FILE__)
git_root_current_file = capture!(%w[git rev-parse --show-toplevel], directory_current_file).chomp
unless git_root_current_file == Dir.pwd
  error "#{$0}: this script must be run from the root of the Gitaly repository"
  abort
end

main(ARGV.first)
